export function parseIDCard(idCard) {
  const regex =
    /^(\d{6})(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])(\d{3})([0-9Xx])$/;

  if (!regex.test(idCard)) {
    return {
      valid: false,
      birthday: '',
      gender: '2',
    };
  }

  const genderDigit = parseInt(idCard.charAt(16)); // 第17位数字（从0开始计数）

  const birthYear = idCard.substring(6, 10);
  const birthMonth = idCard.substring(10, 12);
  const birthDay = idCard.substring(12, 14);

  // 用户性别（0男 1女 2未知）
  const gender = genderDigit % 2 === 1 ? '0' : '1';

  return {
    valid: true,
    birthday: `${birthYear}-${birthMonth}-${birthDay}`,
    gender: gender,
  };
}

/**
 * 根据身高（cm）和体重（kg）计算 BMI 值
 * @param {number} height - 身高（单位：厘米）
 * @param {number} weight - 体重（单位：公斤）
 * @returns {{bmi: number, category: string}} 包含 BMI 值和分类结果
 */
export function calculateBMI(height, weight) {
  if (typeof height !== 'number' || typeof weight !== 'number') {
    throw new Error('身高和体重必须为数字');
  }

  if (height <= 0 || weight <= 0) {
    throw new Error('身高和体重必须大于 0');
  }

  // 将身高从厘米转为米
  const heightM = height / 100;

  const bmi = weight / (heightM * heightM);
  const roundedBMI = Math.round(bmi * 10) / 10; // 保留一位小数

  let category = '';
  if (bmi < 18.5) {
    category = '偏瘦';
  } else if (bmi < 24) {
    category = '正常';
  } else if (bmi < 28) {
    category = '超重';
  } else {
    category = '肥胖';
  }

  return {
    bmi: roundedBMI,
    category,
  };
}

/**
 * 计算年龄（兼容低端安卓）
 * @param {string} birthday - 格式为 "YYYY-MM-DD" 的生日字符串
 * @returns {number|null} 年龄 或 null（无效日期时）
 */
export function calculateAge(birthday) {
  if (!birthday) return null;

  // 简单解析生日字符串
  const birthParts = birthday.split('-');
  if (birthParts.length !== 3) {
    console.error('无效的日期格式:', birthday);
    return null;
  }

  const [year, month, day] = birthParts.map(Number);
  const birthDate = new Date(year, month - 1, day); // 注意：月份从 0 开始

  // 检查是否是合法日期
  if (
    isNaN(birthDate.getTime()) ||
    birthDate.getFullYear() !== year ||
    birthDate.getMonth() !== month - 1 ||
    birthDate.getDate() !== day
  ) {
    console.error('非法日期:', birthday);
    return null;
  }

  const today = new Date();
  let age = today.getFullYear() - birthDate.getFullYear();

  // 如果生日还没到，减一岁
  if (
    today.getMonth() < birthDate.getMonth() ||
    (today.getMonth() === birthDate.getMonth() &&
      today.getDate() < birthDate.getDate())
  ) {
    age--;
  }

  return age;
}

/**
 * 对手机号、身份证号、姓名进行脱敏处理
 * @param {string} type - 类型：'phone' / 'idCard' / 'name'
 * @param {string} value - 原始值
 * @returns {string} 脱敏后的字符串
 */
export function desensitize(type, value) {
  if (!value) return '';

  switch (type) {
    case 'phone':
      // 手机号：保留前3位和后4位，中间用****
      return value.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');

    case 'idCard':
      // 身份证号：保留前6位和后4位，中间隐藏
      return value.replace(/(\d{6})\d{8}(\d{4})/, '$1**********$2');

    case 'name':
      // 姓名：只显示姓氏，其余用*
      if (value.length <= 1) return '*';
      const firstChar = value.charAt(0);
      return firstChar + '*';

    default:
      console.warn('不支持的脱敏类型:', type);
      return value;
  }
}

/**
 * 格式化文件大小（自动转为 KB 或 MB）
 * @param {number} bytes - 文件大小（字节数）
 * @param {number} [decimal=2] - 保留小数位数（默认 2 位）
 * @returns {string} 格式化后的大小（如 "2.54KB"）
 */
export function formatFileSize(bytes, decimal = 2) {
  if (bytes < 0) return '0B';

  const units = ['B', 'KB', 'MB', 'GB', 'TB'];
  let index = 0;

  while (bytes >= 1024 && index < units.length - 1) {
    bytes /= 1024;
    index++;
  }

  // 保留指定小数位数
  return `${bytes.toFixed(decimal)}${units[index]}`;
}
